package com.product;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.util.MQConnectionUtils;

import java.io.IOException;
import java.util.concurrent.TimeoutException;

/**
 问题产生背景:
 生产者发送消息出去之后，不知道到底有没有发送到RabbitMQ服务器， 默认是不知道的。
 而且有的时候我们在发送消息之后，后面的逻辑出问题了，我们不想要发送之前的消息了，需要撤回该怎么做。
 解决方案:
 1.AMQP 事务机制
 2.Confirm 模式
 事务模式:
 txSelect  将当前channel设置为transaction模式
 txCommit  提交当前事务
 txRollback  事务回滚
 *
 */
public class ProducerAmqp {
    private static final String QUEUE_NAME = "test_queue";

    public static void main(String[] args) throws IOException, TimeoutException {
        // 1.获取连接
        Connection newConnection = MQConnectionUtils.newConnection();
        // 2.创建通道
        Channel channel = newConnection.createChannel();
        // 3.创建队列声明,第二个参数：false：不开启持久化，true:开启持久化
        channel.queueDeclare(QUEUE_NAME, false, false, false, null);
        // 将当前管道设置为 txSelect 将当前channel设置为transaction模式 开启事务
        channel.txSelect();
        String msg = "test_yushengjun110";
        try {
            // 4.发送消息
            channel.basicPublish("", QUEUE_NAME, null, msg.getBytes());
            //在不开启事务的情况下，即使后面程序报错，发送的消息也不会回滚
            // int i = 1 / 0;
            channel.txCommit();// 提交事务
            System.out.println("生产者发送消息:" + msg);
        } catch (Exception e) {
            System.out.println("消息进行回滚操作");
            channel.txRollback();// 回滚事务
        } finally {
            channel.close();
            newConnection.close();
        }

    }

}
